import logging
from abc import ABC, abstractmethod
from typing import Dict, List, Set, Any

from 程序核心代码.ast节点.节点定义.基础定义.ast节点基础定义 import ast节点基础模型

logger = logging.getLogger(__name__)

class 分析器基类(ABC):
    """节点分析器的基类，定义通用的分析功能和接口"""
    
    def __init__(self):
        self.分析结果: Dict[str, Any] = {}
        self.已分析节点: Set[ast节点基础模型] = set()
        self.分析日志: List[str] = []
        
    @abstractmethod
    def 分析节点(self, 节点: ast节点基础模型) -> Dict[str, Any]:
        """分析指定节点，返回分析结果"""
        pass
        
    def 记录分析日志(self, 消息: str, 级别: str = "info") -> None:
        """记录分析过程中的日志"""
        self.分析日志.append(f"[{级别.upper()}] {消息}")
        if 级别 == "error":
            logger.error(消息)
        elif 级别 == "warning":
            logger.warning(消息)
        else:
            logger.info(消息)
            
    def 清除分析结果(self) -> None:
        """清除之前的分析结果"""
        self.分析结果.clear()
        self.已分析节点.clear()
        self.分析日志.clear()
        
    def 获取分析报告(self) -> Dict[str, Any]:
        """获取分析报告，包含分析结果和日志"""
        return {
            "分析结果": self.分析结果,
            "已分析节点数": len(self.已分析节点),
            "分析日志": self.分析日志
        }
        
    def 验证节点(self, 节点: ast节点基础模型) -> bool:
        """验证节点是否可以被分析"""
        if not isinstance(节点, ast节点基础模型):
            self.记录分析日志(f"无效的节点类型: {type(节点)}", "error")
            return False
            
        if 节点 in self.已分析节点:
            self.记录分析日志(f"节点已被分析: {节点}", "warning")
            return False
            
        return True
        
    def 标记已分析(self, 节点: ast节点基础模型) -> None:
        """标记节点为已分析状态"""
        self.已分析节点.add(节点)
        
    @abstractmethod
    def 重置(self) -> None:
        """重置分析器状态"""
        self.清除分析结果()
        
    def __str__(self) -> str:
        """返回分析器的字符串表示"""
        return f"{self.__class__.__name__}(已分析节点数={len(self.已分析节点)})" 